/**
 * 防重复提交装饰器
 * 
 * 该装饰器用于防止表单或请求的重复提交，避免数据重复处理。
 * 通过在控制器方法上应用此装饰器，可以在指定时间内阻止相同用户对相同接口的重复请求。
 * 
 * 使用方式：
 * @RepeatSubmit({ expireSeconds: 10 }) // 10秒内不允许重复提交
 * public async createResource() { ... }
 */
import 'reflect-metadata';

/**
 * 防重复提交选项接口
 * @property expireSeconds - 防重复提交的锁定时间（秒）
 */
export interface RepeatSubmitOptions {
  expireSeconds?: number;  // 锁定时间（秒），默认为5秒
}

/**
 * 用于存储防重复提交元数据的键
 * 使用Symbol确保唯一性，避免与其他元数据冲突
 */
const REPEAT_SUBMIT_METADATA_KEY = Symbol('repeatSubmit');

/**
 * 防重复提交装饰器
 * 将防重复提交配置作为元数据附加到目标方法上
 * 
 * @param options - 防重复提交配置选项
 * @returns 方法装饰器
 */
export function RepeatSubmit(options: RepeatSubmitOptions = {}): MethodDecorator {
  return (target, propertyKey, descriptor) => {
    Reflect.defineMetadata(REPEAT_SUBMIT_METADATA_KEY, options, descriptor.value!);
  };
}

/**
 * 获取方法上的防重复提交元数据
 * 供中间件使用，用于获取方法上配置的防重复提交参数
 * 
 * @param target - 目标方法
 * @returns 防重复提交配置选项，如果未设置则返回undefined
 */
export function getRepeatSubmitMetadata(target: any): RepeatSubmitOptions | undefined {
  return Reflect.getMetadata(REPEAT_SUBMIT_METADATA_KEY, target);
} 